import chalk from 'chalk';
import OpenAI from 'openai';
import readline from 'readline';

// Fallback API keys
const TAVILY_API_KEY_FALLBACK = "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"; // 这里填入你的 Tavily API key
const DASHSCOPE_API_KEY_FALLBACK = "YOUR_DASHSCOPE_API_KEY_HERE"; // 这里填入你的 Dashscope API key

// Configure OpenAI client for Dashscope with fallback
const openai = new OpenAI({
    apiKey: process.env.DASHSCOPE_API_KEY || DASHSCOPE_API_KEY_FALLBACK,
    baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
});

// Tavily search function using fetch with fallback API key
async function searchTavily(query) {
    const apiKey = process.env.TAVILY_API_KEY || TAVILY_API_KEY_FALLBACK;
    
    try {
        const response = await fetch('https://api.tavily.com/search', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${apiKey}`
            },
            body: JSON.stringify({
                query: query,
                search_depth: "basic",
                max_results: 3
            })
        });

        if (!response.ok) {
            throw new Error(`搜索API错误: ${response.status}`);
        }

        return await response.json();
    } catch (error) {
        console.error(chalk.red('搜索失败:', error.message));
        return null;
    }
}

// Create readline interface
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

// System prompt
const SYSTEM_PROMPT = `您是一名具有高级推理能力的专家AI助手。您需要提供详细的、逐步的思考过程解释。
对每个步骤：
1. 提供清晰简洁的标题描述当前推理阶段
2. 详细阐述思考过程，必要时使用网络搜索获取最新信息
3. 决定是继续推理还是提供最终答案

请使用以下JSON格式回答：
{
    "steps": [
        {
            "title": "步骤标题",
            "search_query": "需要搜索的问题（如果需要搜索）",
            "content": "详细内容",
            "next_action": "continue或final_answer"
        }
    ]
}

要求：
- 使用至少5个不同的推理步骤
- 在需要事实依据时使用网络搜索
- 承认AI的局限性
- 探索和评估替代答案
- 批判性评估自己的推理
- 使用不同视角重新审视
- 使用至少3种方法验证答案
- 融入领域知识和最佳实践
- 量化确定性水平
- 考虑边缘情况
- 明确排除其他假设的理由`;

// Format response function
async function formatResponse(response) {
    try {
        const steps = JSON.parse(response).steps;
        for (const [index, step] of steps.entries()) {
            console.log(chalk.blue(`\n步骤 ${index + 1}: ${step.title}`));
            
            if (step.search_query) {
                console.log(chalk.yellow(`正在搜索: ${step.search_query}`));
                const searchResult = await searchTavily(step.search_query);
                if (searchResult && searchResult.results) {
                    console.log(chalk.green('\n搜索结果:'));
                    searchResult.results.forEach((result, i) => {
                        console.log(chalk.cyan(`\n来源 ${i + 1}:`));
                        console.log(chalk.white(`标题: ${result.title}`));
                        console.log(chalk.white(`摘要: ${result.snippet}`));
                    });
                }
            }

            console.log(chalk.white(step.content));
            console.log(chalk.yellow(`下一步操作: ${step.next_action === 'continue' ? '继续' : '最终答案'}`));
        }
    } catch (error) {
        console.error(chalk.red('响应格式错误:', error.message));
    }
}

// Main Q&A loop
async function main() {
    while (true) {
        const question = await new Promise(resolve => {
            rl.question(chalk.green('\n请输入您的问题 (输入 "exit" 退出):\n'), resolve);
        });

        if (question.toLowerCase() === 'exit') {
            console.log(chalk.blue('感谢使用！再见！'));
            rl.close();
            break;
        }

        try {
            console.log(chalk.yellow('\n正在思考中...'));
            
            const completion = await openai.chat.completions.create({
                model: "qwen-plus",
                messages: [
                    { role: "system", content: SYSTEM_PROMPT },
                    { role: "user", content: question }
                ],
                temperature: 0.7,
                max_tokens: 2000
            });

            const response = completion.choices[0].message.content;
            await formatResponse(response);
            
        } catch (error) {
            console.error(chalk.red('发生错误:', error.message));
        }
    }
}

// Start application
console.log(chalk.green('欢迎使用高级推理AI助手！'));
console.log(chalk.green('这个助手会提供详细的步骤式推理过程，并在需要时进行网络搜索。'));
main().catch(console.error);